#include "sci_driver.h"


//
// Globals
//

extern MODS_T g_tModS;


uint8_t g_mods_timeout=0;

//
// Send data for SCI-A
//
uint16_t sDataA[8];

//
// Received data for SCI-A
//
uint16_t rDataA[30]={0};


//
// Used for checking the received data
//


//
// Function Prototypes
//
__interrupt void sciaTXFIFOISR(void);
__interrupt void sciaRXFIFOISR(void);
void initSCIAFIFO(void);


//
// Main
//
void USER_InitSCI(void)
{

    GPIO_setMasterCore(139, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_139_SCIRXDC);
    GPIO_setDirectionMode(139, GPIO_DIR_MODE_IN);
    GPIO_setPadConfig(139, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(139, GPIO_QUAL_ASYNC);

    //
    // GPIO29 is the SCI Tx pin.
    //
    GPIO_setMasterCore(56, GPIO_CORE_CPU1);
    GPIO_setPinConfig(GPIO_56_SCITXDC);
    GPIO_setDirectionMode(56, GPIO_DIR_MODE_OUT);
    GPIO_setPadConfig(56, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(56, GPIO_QUAL_ASYNC);

    GPIO_setPinConfig(GPIO_97_GPIO97);
    GPIO_writePin(97, 0);
    GPIO_setPadConfig(97, GPIO_PIN_TYPE_STD);
    GPIO_setQualificationMode(97, GPIO_QUAL_SYNC);
    GPIO_setDirectionMode(97, GPIO_DIR_MODE_OUT);
    GPIO_setControllerCore(97, GPIO_CORE_CPU1);
    g_tModS.SCIRxCount=0;

    Interrupt_register(INT_SCIC_RX, sciaRXFIFOISR);

    //
    // Initialize the Device Peripherals:
    //
    initSCIAFIFO();


    Interrupt_enable(INT_SCIC_RX);
//    Interrupt_enable(INT_SCIC_TX);

    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);


}

//
// error - Function to halt debugger on error
//
//void error(void)
//{
//    Example_Fail = 1;
//    asm("     ESTOP0"); // Test failed!! Stop!
//    for (;;);
//}

//
// sciaTXFIFOISR - SCIA Transmit FIFO ISR
//

void sendData(void)
{
//    memcpy(sDataA,rDataA,8);
//    MODS_SendWithCRC(sDataA, 8);
//    MODS_SendAckOk();

}
__interrupt void sciaTXFIFOISR(void)
{


    //SCI_writeCharArray(SCIC_BASE, sDataA, 2);

    //
    // Increment send data for next cycle
    //


    //SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_TXFF);

    //
    // Issue PIE ACK
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);
}

//
// sciaRXFIFOISR - SCIA Receive FIFO ISR
//
__interrupt void sciaRXFIFOISR(void)
{

//    static uint8_t i=0;

    rDataA[g_tModS.SCIRxCount]=SCI_readCharBlockingFIFO(SCIC_BASE);
    g_tModS.SCIRxCount++;

    MODS_ReciveNew();
    USER_clearModbusRxCount();

    SCI_clearOverflowStatus(SCIC_BASE);

    SCI_clearInterruptStatus(SCIC_BASE, SCI_INT_RXFF);




    //
    // Issue PIE ack
    //
    Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP8);


}

//
// initSCIAFIFO - Configure SCIA FIFO
//
void initSCIAFIFO()
{
    //
    // 8 char bits, 1 stop bit, no parity. Baud rate is 9600.
    //
    SCI_setConfig(SCIC_BASE, DEVICE_LSPCLK_FREQ, SBAUD485, (SCI_CONFIG_WLEN_8 |
                                                        SCI_CONFIG_STOP_ONE |
                                                        SCI_CONFIG_PAR_ODD));

    SCI_resetTxFIFO(SCIC_BASE);
    SCI_resetRxFIFO(SCIC_BASE);

    SCI_setFIFOInterruptLevel(SCIC_BASE, SCI_FIFO_TX2, SCI_FIFO_RX1);
    SCI_performSoftwareReset(SCIC_BASE);

    SCI_resetChannels(SCIC_BASE);
    SCI_enableFIFO(SCIC_BASE);
    SCI_enableModule(SCIC_BASE);

    //
    // RX and TX FIFO Interrupts Enabled
    //
    SCI_enableInterrupt(SCIC_BASE, (SCI_INT_RXFF | SCI_INT_TXFF));
//    SCI_disableInterrupt(SCIC_BASE, SCI_INT_RXERR);





#ifdef AUTOBAUD
    //
    // Perform an autobaud lock.
    // SCI expects an 'a' or 'A' to lock the baud rate.
    //
    SCI_lockAutobaud(SCIC_BASE);
#endif
}

